package com.xuyuan.jdk;

import org.junit.jupiter.api.Test;

import java.io.Console;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.nio.channels.Channel;
import java.util.Map;
import java.util.Objects;
import java.util.Properties;
import java.util.Scanner;

/**
 * System类提供的功能包括标准输入、标准输出和错误输出流;
 * 对外部定义的属性和环境变量的访问;
 * 加载文件和库的方法;
 * 以及用于快速复制数组一部分的实用工具方法。
 */
public class JdkSystem {

    public static void main(String[] args) {
        try (InputStream in = System.in; Scanner scanner = new Scanner(in)) {
            boolean continueInput = true;
            while (continueInput) {
                System.out.println("输入数字（输入 'q' 退出）：");
                if (scanner.hasNextInt()) {
                    int i = scanner.nextInt();
                    System.out.println(i);
                } else {
                    String input = scanner.next();
                    if ("q".equalsIgnoreCase(input)) {
                        continueInput = false;
                    } else {
                        System.out.println("输入错误，请输入一个有效的整数或 'q' 退出。");
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Test
    public void testSystem() throws IOException {
        // 获取JVM相关的系统属性
        Properties properties = System.getProperties();
        properties.forEach((k, v) -> System.out.println(k + ":" + v));

        // 获取操作系统的环境变量
        Map<String, String> env = System.getenv();
        env.forEach((k, v) -> System.out.println(k + ":" + v));

        // 系统提供的IO流
        PrintStream out = System.out;
        PrintStream err = System.err;

        // 加快GC
        System.gc();
        // 执行对象的回收，加快GC。
        // 请求JVM运行所有已经完成的对象的终结方法（finalizer）。
        // 终结方法是对象的一个特殊方法，通常定义在 finalize 方法中，当对象即将被垃圾回收时，JVM 会调用这个方法。
        System.runFinalization();


        // 获取对应系统环境的换行符
        String s = System.lineSeparator();
        // 获取当前时间
        System.nanoTime();
        System.currentTimeMillis();
        // 获取控制台
        Console console = System.console();
        if (Objects.nonNull(console)) console.writer().println("hello");

        // NIO的核心
        Channel channel = System.inheritedChannel();

        // 加载本地库（通常是用 C 或 C++ 编写的动态链接库，如 .dll、.so 或 .dylib）
        System.loadLibrary("xxxx");


        // 终止JVM
        System.exit(0);
    }

}
